本章節中,我們繼續介紹其他的SQL用法與相關的語法範例。
相關的語法使用如下:
GRANT [ON CLUSTER cluster_name] privilege[(column_name [,...])] [,...] ON {db.table|db.*|*.*|table|*} TO {user | role | CURRENT_USER} [,...] [WITH GRANT OPTION] [WITH REPLACE OPTION]
從上述的語法可以得知,privilege
是使用者權限定義;而role
是ClickHouse資料庫角色,user
則是ClickHouse資料庫使用者的帳號。
下列的語法使用是指定某個使用者帳號賦予角色的方式:
GRANT [ON CLUSTER cluster_name] role [,...] TO {user | another_role | CURRENT_USER} [,...] [WITH ADMIN OPTION] [WITH REPLACE OPTION]
下列是使用範例:
GRANT SELECT(x,y) ON db.table TO john WITH GRANT OPTION
從上述的執行語法,我們可以知道指定john使用者可以在某個資料庫底下的資料表進行下列的SELECT
的x與y欄位權限,相關可以執行的語法如下:
若是使用*
來表示權限的設定,則是指定使用者可以執行任意有關於SELECT所有的權限,相關的執行語法範例如下:
GRANT SELECT, INSERT ON *.* TO john, robin
從上述語法可以知道,指定john與robin的使用者可以使用有關於任意SELECT與INSERT的權限。
更多的權限存取清單可以參考此列表。
我們可以使用此語句將某個使用者所設定的權限進行撤銷,相關的語法使用如下:
REVOKE [ON CLUSTER cluster_name] privilege[(column_name [,...])] [,...] ON {db.table|db.*|*.*|table|*} FROM {user | CURRENT_USER} [,...] | ALL | ALL EXCEPT {user | CURRENT_USER} [,...]
從上述的語法,我們可以將指定的使用者的權限進行取消。
透過下列的語法則可以將指定的使用者角色進行取消:
REVOKE [ON CLUSTER cluster_name] [ADMIN OPTION FOR] role [,...] FROM {user | role | CURRENT_USER} [,...] | ALL | ALL EXCEPT {user_name | role_name | CURRENT_USER} [,...]
相關上述的語法範例如下:
GRANT SELECT ON *.* TO john;
REVOKE SELECT ON accounts.* FROM john;
從上述的語法可以知道,首先先使用GRANT語句將john使用者設定有所有SELECT權限,接著再撤銷accounts資料庫SELECT之權限,意思就是john除了accounts資料庫之外,其他的資料庫都可以進行查詢SELECT權限。
GRANT SELECT ON accounts.staff TO mira;
REVOKE SELECT(wage) ON accounts.staff FROM mira;
從上述的語法可以知道,先將mira使用者設定對accounts資料庫中的staff資料表進行查詢的權限,接著再撤銷staff資料表中的wage欄位的查詢。換句話說就是mira使用者除了accounts資料庫的staff資料表中的wage欄位不可以查詢之外,其他在該資料表中的欄位都可以進行SELECT查詢。
我們可以使用ATTACH語句將指定且已經存在的資料表移到另一個資料庫或是另一台資料庫伺服器上,相關的語法如下:
ATTACH TABLE [IF NOT EXISTS] [db.]name [ON CLUSTER cluster]
或者可以使用下列的語法先指定資料檔案來建立新的資料表,相關的語法如下:
ATTACH TABLE name FROM 'path/to/data/' (col1 Type1, ...)
相關的語法範例如下:
DROP TABLE IF EXISTS test;
INSERT INTO TABLE FUNCTION file('01188_attach/test/data.TSV', 'TSV', 's String, n UInt8') VALUES ('test', 42);
ATTACH TABLE test FROM '01188_attach/test' (s String, n UInt8) ENGINE = File(TSV);
SELECT * FROM test;
從上述的SQL範例可以得知,首先若test資料表存在的話,先將test資料表進行移除,接著使用內建的file函式指定某個路徑下的TSV檔進行內容儲存;接著使用ATTACH語句將指定儲存的TSV檔轉成test資料表。
若資料庫引擎使用的是Atomic的話,則可以指定資料表的UUID來執行ATTACH語句,相關的範例如下:
ATTACH TABLE name UUID '<uuid>' (col1 Type1, ...)
我們也可以使用下列的語法將已經存在的Dictinoary進行移動,相關的語法使用如下:
ATTACH DICTIONARY [IF NOT EXISTS] [db.]name [ON CLUSTER cluster]
我們可以使用下列的語法來檢查指定的資料表情形與健康狀態,相關的語法範例如下:
CHECK TABLE [db.]name
執行上述的語句範例如下:
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) CHECK TABLE simple_table;
CHECK TABLE simple_table
Query id: 8a667a48-bf42-4cf7-a3c7-177ca982ed19
┌─result─┐
│ 1 │
└────────┘
1 row in set. Elapsed: 0.001 sec.
檢查資料表只會有一個result欄位,其欄位的型別為布林值,分別代表的意思如下:
此語句只支援下列這些的資料表引擎:
對於檢查MergeTree家族系列的資料表引擎,若設定check_query_single_value_result
值為0的話,則表示將資料表中每個資料部分進行資料的檢查,相關的語句執行如下:
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) SET check_query_single_value_result = 0;
SET check_query_single_value_result = 0
Query id: 3192a8c9-7b6a-4773-a65b-5b6ce940ff34
Ok.
0 rows in set. Elapsed: 0.001 sec.
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) CHECK TABLE simple_table;
CHECK TABLE simple_table
Query id: 7c276ff4-6dad-4cff-824c-61cc24ca980f
┌─part_path─┬─is_passed─┬─message─┐
│ all_1_1_0 │ 1 │ │
└───────────┴───────────┴─────────┘
1 row in set. Elapsed: 0.001 sec.
若是將``設定為1,則只會檢查一般資料表目前的狀態,相關的語法執行如下:
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) SET check_query_single_value_result = 1;
SET check_query_single_value_result = 1
Query id: 83a5b521-6955-42da-9137-303467c0eb7e
Ok.
0 rows in set. Elapsed: 0.001 sec.
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :)
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) CHECK TABLE simple_table;
CHECK TABLE simple_table
Query id: 786d62f9-cdb6-4b5f-bad1-17b0771f753b
┌─result─┐
│ 1 │
└────────┘
1 row in set. Elapsed: 0.002 sec.
如果檢查出資料表的狀態是損壞的話,可以按照下列的步驟進行操作:
CREATE TABLE <new_table_name> AS <damaged_table_name>
此SQL語句來完成。max_threads
之設定值為1使用單一執行緒處理之後的查詢,我們可以使用SET max_threads = 1
的SQL語句來完成此設定。INSERT INTO <new_table_name> SELECT * FROM <damaged_table_name>
的SQL語句,這個SQL語句會複製在損壞資料表中尚未損壞的資料寫入到新建的資料表中。
clickhouse-client
ClickHouse資料庫客戶端來重置max_threads
之設定,相關重啟設定的方式過程如下:ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) SET max_threads=1;
SET max_threads = 1
Query id: 1908141f-321c-4f04-b2b2-825e05b61486
Ok.
0 rows in set. Elapsed: 0.001 sec.
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) SHOW SETTINGS LIKE '%max_threads%';
SHOW SETTINGS LIKE '%max_threads%'
Query id: a6657d91-cb79-4990-928f-942eeaae7f2e
┌─name─────────────────────────────┬─type───────┬─value─┐
│ max_threads │ MaxThreads │ 1 │
│ max_streams_to_max_threads_ratio │ Float │ 1 │
└──────────────────────────────────┴────────────┴───────┘
2 rows in set. Elapsed: 0.004 sec.
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) exit;
root@ubuntu-s-4vcpu-8gb-amd-sgp1-01:~# clickhouse-client --password
ClickHouse client version 22.8.4.7 (official build).
Password for user (default):
Connecting to localhost:9000 as user default.
Connected to ClickHouse server version 22.8.4 revision 54460.
Warnings:
* Linux is not using a fast TSC clock source. Performance can be degraded. Check /sys/devices/system/clocksource/clocksource0/current_clocksource
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) SHOW SETTINGS LIKE '%max_threads%';
SHOW SETTINGS LIKE '%max_threads%'
Query id: 5ded23d5-d761-422e-b6d1-a7661ea77e73
┌─name─────────────────────────────┬─type───────┬─value─────┐
│ max_threads │ MaxThreads │ 'auto(4)' │
│ max_streams_to_max_threads_ratio │ Float │ 1 │
└──────────────────────────────────┴────────────┴───────────┘
2 rows in set. Elapsed: 0.002 sec.
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :)
我們可以透過此SQL語句來檢查一個資料表的綱要與結構,相關的語法使用如下:
DESC|DESCRIBE TABLE [db.]table [INTO OUTFILE filename] [FORMAT format]
執行完上述的SQL語法之後,產生的結果資料表,相關的欄位說明如下:
describe_include_subcolumns
之設定有關,若設定為1,則會顯示該欄位,預設為0。相關的SQL語句執行所輸出的訊息如下:
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) CREATE TABLE describe_example (
id UInt64, text String DEFAULT 'unknown' CODEC(ZSTD),
user Tuple (name String, age UInt8)
) ENGINE = MergeTree() ORDER BY id;
CREATE TABLE describe_example
(
`id` UInt64,
`text` String DEFAULT 'unknown' CODEC(ZSTD),
`user` Tuple(name String, age UInt8)
)
ENGINE = MergeTree
ORDER BY id
Query id: 5acb4055-10db-4923-bd4f-ba09f78a8ce6
Ok.
0 rows in set. Elapsed: 0.007 sec.
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) DESCRIBE TABLE describe_example;
DESCRIBE TABLE describe_example
Query id: 56f89af4-b87d-4236-88cd-d13876086649
┌─name─┬─type──────────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
│ id │ UInt64 │ │ │ │ │ │
│ text │ String │ DEFAULT │ 'unknown' │ │ ZSTD(1) │ │
│ user │ Tuple(name String, age UInt8) │ │ │ │ │ │
└──────┴───────────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
3 rows in set. Elapsed: 0.001 sec.
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) DESCRIBE TABLE describe_example SETTINGS describe_include_subcolumns=1;
DESCRIBE TABLE describe_example
SETTINGS describe_include_subcolumns = 1
Query id: e479ef37-bcac-4bb5-8217-95cf39aedbec
┌─name──────┬─type──────────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┬─is_subcolumn─┐
│ id │ UInt64 │ │ │ │ │ │ 0 │
│ text │ String │ DEFAULT │ 'unknown' │ │ ZSTD(1) │ │ 0 │
│ user │ Tuple(name String, age UInt8) │ │ │ │ │ │ 0 │
│ user.name │ String │ │ │ │ │ │ 1 │
│ user.age │ UInt8 │ │ │ │ │ │ 1 │
└───────────┴───────────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┴──────────────┘
5 rows in set. Elapsed: 0.001 sec.
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :)
從上述的最後一個執行的SQL語句可以知道,在執行DESCRIBE TABLE describe_example
後面接設定describe_include_subcolumns
為1時,則會多輸出is_subcolumn
欄位出來。
因為user
欄位為Tuple,因此是有子欄位,子欄位有name
與age
。
我們可以透過此SQL語句將指定的資料表、物化的視圖(Materalized view)或是字典(dictionary)進行遺忘的動作,當設定資料表為遺忘的時候,需要注意下列的事項:
CREATE TABLE
的語句建立和遺忘的資料表名稱相同的資料表,遺忘的資料表需要在執行DETACH語句時候設定為PERMANENTLY才會有影響。RENAME TABLE
語句將遺忘的資料表進行重新命名。相關的語法如下:
DETACH TABLE|VIEW|DICTIONARY [IF EXISTS] [db.]name [ON CLUSTER cluster] [PERMANENTLY] [SYNC]
若執行DETACH語句時候,沒有設定PERMANENTLY
時,則在ClickHouse資料庫伺服器在重啟時,則可以再針對這些設定成遺忘的資料表進行讀取,相關的語法執行與輸出的訊息如下:
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) CREATE TABLE test ENGINE = Log AS SELECT * FROM numbers(10);
CREATE TABLE test
ENGINE = Log AS
SELECT *
FROM numbers(10)
Query id: 33cc2adf-6e9d-4753-93f8-72570bd4789a
Ok.
0 rows in set. Elapsed: 0.007 sec.
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) SELECT * FROM test;
SELECT *
FROM test
Query id: 87deaef5-744f-4b67-b9c2-bb3ba78388bb
┌─number─┐
│ 0 │
│ 1 │
│ 2 │
│ 3 │
│ 4 │
│ 5 │
│ 6 │
│ 7 │
│ 8 │
│ 9 │
└────────┘
10 rows in set. Elapsed: 0.002 sec.
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) DETACH TABLE test;
DETACH TABLE test
Query id: 28324da9-6a18-4713-911c-57ca9905fddd
Ok.
0 rows in set. Elapsed: 0.001 sec.
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) SELECT * FROM test;
SELECT *
FROM test
Query id: 003916f6-36a8-4f89-bc9f-3afa9193ce13
0 rows in set. Elapsed: 0.002 sec.
Received exception from server (version 22.8.4):
Code: 60. DB::Exception: Received from localhost:9000. DB::Exception: Table default.test doesn't exist. (UNKNOWN_TABLE)
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) exit
Bye.
root@ubuntu-s-4vcpu-8gb-amd-sgp1-01:~# systemctl restart clickhouse-server.service
root@ubuntu-s-4vcpu-8gb-amd-sgp1-01:~# clickhouse-client --password
ClickHouse client version 22.8.4.7 (official build).
Password for user (default):
Connecting to localhost:9000 as user default.
Connected to ClickHouse server version 22.8.4 revision 54460.
Warnings:
* Linux is not using a fast TSC clock source. Performance can be degraded. Check /sys/devices/system/clocksource/clocksource0/current_clocksource
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) SELECT * FROM test;
SELECT *
FROM test
Query id: 58036b99-f34e-40db-97d4-d28d360d561d
┌─number─┐
│ 0 │
│ 1 │
│ 2 │
│ 3 │
│ 4 │
│ 5 │
│ 6 │
│ 7 │
│ 8 │
│ 9 │
└────────┘
10 rows in set. Elapsed: 0.001 sec.
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) DETACH TABLE test PERMANENTLY;
DETACH TABLE test PERMANENTLY
Query id: 8af7267f-7fd3-4963-a1cd-393b55dbe125
Ok.
0 rows in set. Elapsed: 0.001 sec.
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :)
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) exit
Bye.
root@ubuntu-s-4vcpu-8gb-amd-sgp1-01:~# systemctl restart clickhouse-server.service
root@ubuntu-s-4vcpu-8gb-amd-sgp1-01:~# clickhouse-client --password
ClickHouse client version 22.8.4.7 (official build).
Password for user (default):
Connecting to localhost:9000 as user default.
Connected to ClickHouse server version 22.8.4 revision 54460.
Warnings:
* Linux is not using a fast TSC clock source. Performance can be degraded. Check /sys/devices/system/clocksource/clocksource0/current_clocksource
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) SELECT * FROM test;
SELECT *
FROM test
Query id: 7f656960-e25a-4df8-94c6-a5830748e318
0 rows in set. Elapsed: 0.002 sec.
Received exception from server (version 22.8.4):
Code: 60. DB::Exception: Received from localhost:9000. DB::Exception: Table default.test doesn't exist. (UNKNOWN_TABLE)
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :)
從上述的SQL語句執行的輸出訊息可以知道,使用DETACH
語句沒有加上PERMANENTLY
時,將ClickHouse資料庫伺服器重新啟動之後,則可以繼續讀取該資料表,若設定了PERMANENTLY
之後,該資料表就永久的在此ClickHouse資料庫中遺忘。
在本章節中,我們展示了幾個SQL語句的語法範例與用法,下一章節中,將會再介紹其他的SQL語句的用法與範例。